[業務効率化] Microsoft FlowでSlackへの通知を自動化する
Guten Morgen!ベルリンより伊藤です。気温 -11℃の中、今日も元気よく出社いたしました!
最近 Microsoft Flow を使ってみてなかなか簡単で便利でした。
意外と手っ取り早いHowto記事が見当たらなかったので、初心者向けの内容で共有します。
やったのはこの2つ
- Outlookで作成した予定をGoogleカレンダーへコピーする(超簡単)
- 毎月定期的にSlackのチャネルへ通知する(簡単)
Microsoft Flowとは
MSサービスだけでなく、Google、Slack、Facebookなど様々なアプリケーション同士での処理の自動ワークフローを作成することができ、便利なテンプレートが数多く用意されているので、初心者でも簡単に使えます。
テンプレートには例えばこんなものが。
- 上司からメールを受信したらプッシュ通知を受け取る
- Outlook 365の添付ファイルをGoogle Driveに保存する
- 毎月その日が期限のWunderlistタスクの一覧をメールで受け取る
- Instagram の写真を Dropbox に保存する
- 英語以外のツイートを翻訳して英語でリツイートする
仕事でもプライベートでも使えそうです。
Outlookで作成した予定をGoogleカレンダーへコピー
テンプレをそのまま活用した例を紹介します。
ユースケース
Exchange OnlineとGmailでそれぞれメールアドレスを持っており、普段の予定管理はGoogleカレンダーを使いますが、たまにOutlookで会議通知を入れるので、Googleカレンダーに集約させたいという状況でした。
作り方
では早速作ります!今回使うテンプレートはこちら
Outlook.com calendar to Google Calendar
テンプレートを選択して続行。初めての場合はアカウントを連携させます。
フローの編集画面が開きます。最低限やらなければいけないことは、
- Outlookカレンダーの予定表IDを選択する(Calendarなど)
- Googleカレンダーの予定表IDを選択する(メールアドレスなど)
- 「フローの作成」をクリック
はい、できました。
なお、Condition(条件)で「on your Google Calendar」を本文に含む予定が除外されているのは、逆のテンプレ(Google CalendarからOutlookへ連携)を適用している場合、重複して読み込むのを避けるためです。今回は不要ですが、予定にわざわざこの文字を入れない限りあっても問題なしです。
テスト
Outlookで予定を入れてみます。
件名・場所・開始/終了時間・本文を指定したら、しばらくしてGoogleカレンダーにこのように入りました。
解説
テンプレのメッセージの内容ですが、以下のようになっています。
@{take(if(triggerBody()?['IsHtml'],coalesce(body('Html_to_text'),''),coalesce(triggerBody()?['Body'],'')),6000)} ---- @{if(empty(triggerBody()['RequiredAttendees']),'',concat('Required attendees: ',take(replace(triggerBody()['RequiredAttendees'],';',', '),500)))} @{if(empty(triggerBody()['OptionalAttendees']),'',concat('Optional attendees: ',take(replace(triggerBody()['OptionalAttendees'],';',', '),500)))} Copied from your Outlook.com calendar (@{triggerBody()?['Id']})
2つの@{if(...)}は、それぞれ「必須出席者」と「任意出席者」です。
今回のテストは自分の予定なので含まれませんでしたが、会議通知などでこれらの値がある場合は、以下のように表示されます。(必須出席者の値がある場合)
<本文> ---- Required attendees: <メールアドレス> Copied from your Outlook.com calendar (...
より詳細に理解されたい方やカスタマイズされたい方は、関数等の一覧を以下よりご参照ください。
Azure Logic Apps のワークフロー定義言語スキーマ
なお、このテンプレートは予定の作成をトリガーとしているため、作成済みのOutlookの予定を修正した場合にはGoogleカレンダーへ連携されません。別途テンプレートやカスタマイズをご利用ください。
毎月定期的にSlackのチャネルへ通知する
ユースケース
ベルリンオフィスにて社員の経費申請締め切りを翌月10日(休みの場合は前営業日)と決め、Slackの経費関連チャネルでアナウンスしましたが、毎月手動で通知するのはなぁ...
ということで、毎月10日に特定のSlackチャネルへ通知を投げるフローを作成します。
作り方
1から作るか、テンプレートを元にカスタマイズします。今回はこのテンプレートを元にして後半を変更しました。
指定した間隔でカスタム リマインダーを送信する
事前準備(任意)
動作確認をするため、Slackにテスト用のチャネルを作成します。Slackの「Create a channel」よりPrivateで新規チャネル『testchannel』を作成。
フロー編集
アカウント連携画面の後、フローの編集画面を開きます。
毎月10日(または前営業日)に通知するため、以下のような構成としました。(祝日がある場合までは考慮せず)
- 毎月8日にフローが起動
- 8日が金曜日の場合は、Slack通知(10日が日曜のため8日に通知)
- 8日が木曜日の場合は、1日待機してSlack通知(10日が土曜のため9日に通知)
- いずれでもない場合は、2日待機してSlack通知(10日に通知)
具体的な手順はこちらです。
(1)Reminderを設定
以下のように設定します。(現地時間2018/3/1 10:00から毎月の場合)
- 間隔:1
- 頻度:月
- タイムゾーン:UTC+01:00(日本ならUTC+09:00)
- 開始時刻:2018-03-01T09:00:00Z(処理を開始する日付をyyyy-mm-ddThh:mm:ssZで入力)
(テンプレ使用の場合)Send an emailのアクションのメニューから「削除」を選択し、Outlookのアクションを削除してください。
(2)現在の時刻を取得(アクションの追加)
「新しいステップ」から「アクションの追加」を選択し、「日付と時刻 - 現在の時刻」を選択します。設定は特になし。
(3)条件 その1
「新しいステップ」から「条件の追加」を選択します。
- 基本モードの場合:「動的なコンテンツの追加」をクリックし、式タブから『dayOfWeek()』関数を選択し、動的なコンテンツタブから『現在の時刻』を選択(下図参照)し、OKで閉じます。『次の値に等しい』を選択し、右辺に5と入力します。
-
詳細設定モードの場合:「詳細設定モードで編集」をクリックし、@equals(dayOfWeek(body('現在の時刻')), 5)と入力します。
※5は金曜日を意味します。
(4)条件 その2
「いいえの場合」内で再び「条件の追加」を選択します。前項と同様の手順で、@equals(dayOfWeek(body('現在の時刻')), 4)となるようにします。
※4は木曜日を意味します。
(5)スケジュール - 延期期限(アクションの追加)
直前で追加した「はいの場合」内に「スケジュール - 延期期限」を追加し、タイムスタンプにaddDays(body('現在の時刻'),1)と入力します。
同様に「いいえの場合」内に「スケジュール - 延期期限」を追加し、タイムスタンプにaddDays(body('現在の時刻'),2)と入力します。
条件1の「いいえの場合」内が(4)、(5)で以下のようになるはずです。
(6)Slack - 投稿メッセージ(アクションの追加)
- チャネル名:testchannel(※1)
- メッセージテキスト:表示させるメッセージ
- ユーザとして投稿する:はい(※2)
※1 プライベートのためかセレクタに表示されませんが、カスタム値として入力します ※2 「いいえ」を選択すると、『Microsoft Power Apps + Flow』というアプリからの通知として表示されます
これで作成!
テスト
今日は水曜日なので、条件1を一時的に3に変え、「今すぐ実行」を選択します。
ただーん、届きました
終わったら、条件1の値を5に戻し、チャネル名は対象のチャネル名に変えましょう。
解説
関数
手順の(3)、(4)、(6)で登場した関数は、こちらより使える一覧と詳細を確認できます。
Azure Logic Apps のワークフロー定義言語スキーマ
ハマりかけたところとして、基本モードで見ると表示は同じなのに、詳細設定モードで見ると@equals(dayOfWeek(body('現在の時刻')), '5')のように値がクォーテーションで囲まれてしまって文字列として扱われていて、正しいルートに入らなかったケースがありました。
Slackのメッセージ
(6)のメッセージ内容は以下のように入力しています。
<@ABCD12345> 本日は@{dayOfMonth(body('現在の時刻'))}日、先月分の経費申請期限です。 Onexmaの入力をお忘れなく! Please submit your monthly settlement for the previous month by today! https://www.onexma.com/cgi-bin/user.cgi
Slackのメッセージで使えるAPIは公式ドキュメントに掲載されています。
宛先について、本当は@channelを使いたかったのですが、今現在は対応されていないよう。
Consider a future where mentioning channels required using only its ID and channel names were not necessarily unique or following the same structure as #channel names today. That future will one day arrive. Get ahead of the curve and use channel IDs for all indexing and storage organization.
なので今回は<@ABCD12345>の部分を個人へ指名してみました。Slackで相手のプロフィールを開き、[More actions]より”Copy member ID”の欄で英数9桁のIDをコピーできます。上記が導入されれば、同様に付与されている各チャネルIDを使い、@channelを指定できるようになると思われます。
おまけ
様々なサービスが連携されている中で、残念ながら現時点ではLINEが対象サービスにありません。
IFTTTというサービスは、フローに比べると条件を追加できないなどカスタマイズに制限はありますが、LINEへ連携する自動化テンプレがあり、例えば特定のTwitterユーザのつぶやきをLINEに通知するなどが可能です。
スマホアプリで簡単に導入でき、Alexaと連携するテンプレもあり、javascriptで追加のカスタマイズができますので、ご興味ある方はこちらも見てみてください。